package cn.fql.ymcc.exception;

import cn.fql.ymcc.enumcode.GlobalErrorCodeEnum;
import cn.fql.ymcc.result.JSONResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.List;

/**
 *当其他的类conroller发送了异常后，返回的信息会被当前的类拦截
 * @exceptionhandler：根据异常的类型，走不同的方法去处理异常
 *
 */

@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

    //一旦发生了 Exception 这个异常  就会走下面的这个方法  -- 综合的系统异常
    @ExceptionHandler(Exception.class)
    public JSONResult systemException(Exception e){
        //把具体的错误信息展示到后台consloe
        e.printStackTrace();
        return JSONResult.error(GlobalErrorCodeEnum.SYSTEM_ERROR);

    }

    /**
     * 用户参数与业务规则不同
     * @param e
     * @return
     */
    @ExceptionHandler(BusinessException.class)
    public JSONResult businessException(BusinessException e){
        //把具体的错误信息展示到后台consloe
        e.printStackTrace();
        return JSONResult.error(e.getMessage(),GlobalErrorCodeEnum.BUSINESS_ERROR.getCode());
    }

    /**
     *添加数据的时候 参数不合法
     *  对JSR303支持
     * @param e
     * @return
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public JSONResult jsr303Exception(MethodArgumentNotValidException e){
        //把具体的错误信息展示到后台consloe
        StringBuilder sb = new StringBuilder();
        List<ObjectError> allErrors = e.getBindingResult().getAllErrors();
        //把产生的错误拼接再一起
        allErrors.forEach(err->{
            sb.append(err.getDefaultMessage()).append(";");
        });
        e.printStackTrace();
        return JSONResult.error(sb.toString(),GlobalErrorCodeEnum.PARAM_ERROR.getCode());
    }

}
